<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Scale space implementation</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Scale_space_implementation"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.math.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Scale_space_implementation rootpage-Scale_space_implementation skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Scale space implementation</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><style data-mw-deduplicate="TemplateStyles:r1295905060">
/* start https://en.wikipedia.org/ */
.mw-parser-output .infobox-subbox{padding:0;border:none;margin:-3px;width:auto;min-width:100%;font-size:100%;clear:none;float:none;background-color:transparent}.mw-parser-output .infobox-3cols-child{margin:auto}.mw-parser-output .infobox .navbar{font-size:100%}@media screen{html.skin-theme-clientpref-night .mw-parser-output .infobox-full-data:not(.notheme)>div:not(.notheme)[style]{background:#1f1f23!important;color:#f8f9fa}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .infobox-full-data:not(.notheme)>div:not(.notheme)[style]{background:#1f1f23!important;color:#f8f9fa}}@media(min-width:640px){body.skin--responsive .mw-parser-output .infobox-table{display:table!important}body.skin--responsive .mw-parser-output .infobox-table>caption{display:table-caption!important}body.skin--responsive .mw-parser-output .infobox-table>tbody{display:table-row-group}body.skin--responsive .mw-parser-output .infobox-table th,body.skin--responsive .mw-parser-output .infobox-table td{padding-left:inherit;padding-right:inherit}}
/* end https://en.wikipedia.org/ */
</style><table class="infobox" style="width:20em;"><tbody><tr><th colspan="2" class="infobox-above"><a href="Scale_space" title="Scale space">Scale space</a></th></tr><tr><td colspan="2" class="infobox-full-data"><a href="Scale-space_axioms" title="Scale-space axioms">Scale-space axioms</a></td></tr><tr><td colspan="2" class="infobox-full-data"></td></tr><tr><th colspan="2" class="infobox-header"><a href="Feature_(computer_vision)" title="Feature (computer vision)">Feature detection</a></th></tr><tr><td colspan="2" class="infobox-full-data"><a href="Edge_detection" title="Edge detection">Edge detection</a></td></tr><tr><td colspan="2" class="infobox-full-data"><a href="Blob_detection" title="Blob detection">Blob detection</a></td></tr><tr><td colspan="2" class="infobox-full-data"><a href="Corner_detection" title="Corner detection">Corner detection</a></td></tr><tr><td colspan="2" class="infobox-full-data"><a href="Ridge_detection" title="Ridge detection">Ridge detection</a></td></tr><tr><td colspan="2" class="infobox-full-data"><a href="Interest_point_detection" class="mw-redirect" title="Interest point detection">Interest point detection</a></td></tr><tr><th colspan="2" class="infobox-header"><a href="Scale_space#Scale_selection" title="Scale space">Scale selection</a></th></tr><tr><th colspan="2" class="infobox-header"><a href="Affine_shape_adaptation" title="Affine shape adaptation">Affine shape adaptation</a></th></tr><tr><th colspan="2" class="infobox-header"><a href="Scale-space_segmentation" title="Scale-space segmentation">Scale-space segmentation</a></th></tr><tr><td colspan="2" class="infobox-navbar"><style data-mw-deduplicate="TemplateStyles:r1129693374">
/* start https://en.wikipedia.org/ */
.mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:": "}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:" · ";font-weight:bold}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist dd dd:first-child::before,.mw-parser-output .hlist dd dt:first-child::before,.mw-parser-output .hlist dd li:first-child::before,.mw-parser-output .hlist dt dd:first-child::before,.mw-parser-output .hlist dt dt:first-child::before,.mw-parser-output .hlist dt li:first-child::before,.mw-parser-output .hlist li dd:first-child::before,.mw-parser-output .hlist li dt:first-child::before,.mw-parser-output .hlist li li:first-child::before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child::after,.mw-parser-output .hlist dd dt:last-child::after,.mw-parser-output .hlist dd li:last-child::after,.mw-parser-output .hlist dt dd:last-child::after,.mw-parser-output .hlist dt dt:last-child::after,.mw-parser-output .hlist dt li:last-child::after,.mw-parser-output .hlist li dd:last-child::after,.mw-parser-output .hlist li dt:last-child::after,.mw-parser-output .hlist li li:last-child::after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:" ("counter(listitem)"\a0 "}
/* end https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r1239400231">
/* start https://en.wikipedia.org/ */
.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}html.skin-theme-clientpref-night .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}}@media print{.mw-parser-output .navbar{display:none!important}}
/* end https://en.wikipedia.org/ */
</style></td></tr></tbody></table>
<p>In the areas of <a href="Computer_vision" title="Computer vision">computer vision</a>, <a href="Image_analysis" title="Image analysis">image analysis</a> and <a href="Signal_processing" title="Signal processing">signal processing</a>, the notion of scale-space representation is used for processing measurement data at multiple scales, and specifically enhance or suppress image features over different ranges of scale (see the article on <a href="Scale_space" title="Scale space">scale space</a>). A special type of scale-space representation is provided by the Gaussian scale space, where the image data in <i>N</i> dimensions is subjected to smoothing by Gaussian <a href="Convolution" title="Convolution">convolution</a>. Most of the theory for Gaussian scale space deals with continuous images, whereas one when implementing this theory will have to face the fact that most measurement data are discrete. Hence, the theoretical problem arises concerning how to discretize the continuous theory while either preserving or well approximating the desirable theoretical properties that lead to the choice of the Gaussian kernel (see the article on <a href="Scale-space_axioms" title="Scale-space axioms">scale-space axioms</a>). This article describes basic approaches for this that have been developed in the literature, see also <sup id="cite_ref-Lin24_1-0" class="reference"><a href="#cite_note-Lin24-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> for an in-depth treatment regarding the topic of approximating the Gaussian smoothing operation and the Gaussian derivative computations in scale-space theory, and <sup id="cite_ref-Lin25_2-0" class="reference"><a href="#cite_note-Lin25-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> for a complementary treatment regarding hybrid discretization methods.
</p><p><br>
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Statement_of_the_problem">Statement of the problem</h2></div>
<p>The <b>Gaussian <a href="Scale-space_representation" class="mw-redirect" title="Scale-space representation">scale-space representation</a></b> of an <i>N</i>-dimensional continuous signal,
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle f_{C}\left(x_{1},\cdots ,x_{N},t\right),}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>C</mi>
</mrow>
</msub>
<mrow>
<mo>(</mo>
<mrow>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>,</mo>
<mo>⋯<!-- ⋯ --></mo>
<mo>,</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mo>,</mo>
<mi>t</mi>
</mrow>
<mo>)</mo>
</mrow>
<mo>,</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle f_{C}\left(x_{1},\cdots ,x_{N},t\right),}</annotation>
</semantics>
</math></span><img src="./85068ddb60fcacfc3f332e6b1d91645e51262c1d.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:18.308ex; height:2.843ex;" alt="{\displaystyle f_{C}\left(x_{1},\cdots ,x_{N},t\right),}" loading="lazy"></span></dd></dl>
<p>is obtained by <a href="Convolution" title="Convolution">convolving</a> <i>f<sub>C</sub></i> with an <i>N</i>-dimensional <a href="Gaussian_kernel" class="mw-redirect" title="Gaussian kernel">Gaussian kernel</a>:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle g_{N}\left(x_{1},\cdots ,x_{N},t\right).}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>g</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mrow>
<mo>(</mo>
<mrow>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>,</mo>
<mo>⋯<!-- ⋯ --></mo>
<mo>,</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mo>,</mo>
<mi>t</mi>
</mrow>
<mo>)</mo>
</mrow>
<mo>.</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle g_{N}\left(x_{1},\cdots ,x_{N},t\right).}</annotation>
</semantics>
</math></span><img src="./4e5ab9ec43b69a3da34d2f2dc9db3401b94137c6.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:18.488ex; height:2.843ex;" alt="{\displaystyle g_{N}\left(x_{1},\cdots ,x_{N},t\right).}" loading="lazy"></span></dd></dl>
<p>In other words:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle L\left(x_{1},\cdots ,x_{N},t\right)=\int _{u_{1}=-\infty }^{\infty }\cdots \int _{u_{N}=-\infty }^{\infty }f_{C}\left(x_{1}-u_{1},\cdots ,x_{N}-u_{N},t\right)\cdot g_{N}\left(u_{1},\cdots ,u_{N},t\right)\,du_{1}\cdots du_{N}.}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>L</mi>
<mrow>
<mo>(</mo>
<mrow>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>,</mo>
<mo>⋯<!-- ⋯ --></mo>
<mo>,</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mo>,</mo>
<mi>t</mi>
</mrow>
<mo>)</mo>
</mrow>
<mo>=</mo>
<msubsup>
<mo>∫<!-- ∫ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>=</mo>
<mo>−<!-- − --></mo>
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
</msubsup>
<mo>⋯<!-- ⋯ --></mo>
<msubsup>
<mo>∫<!-- ∫ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mo>=</mo>
<mo>−<!-- − --></mo>
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
</msubsup>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>C</mi>
</mrow>
</msub>
<mrow>
<mo>(</mo>
<mrow>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>−<!-- − --></mo>
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>,</mo>
<mo>⋯<!-- ⋯ --></mo>
<mo>,</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mo>−<!-- − --></mo>
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mo>,</mo>
<mi>t</mi>
</mrow>
<mo>)</mo>
</mrow>
<mo>⋅<!-- ⋅ --></mo>
<msub>
<mi>g</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mrow>
<mo>(</mo>
<mrow>
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>,</mo>
<mo>⋯<!-- ⋯ --></mo>
<mo>,</mo>
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mo>,</mo>
<mi>t</mi>
</mrow>
<mo>)</mo>
</mrow>
<mspace width="thinmathspace"></mspace>
<mi>d</mi>
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>⋯<!-- ⋯ --></mo>
<mi>d</mi>
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mo>.</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle L\left(x_{1},\cdots ,x_{N},t\right)=\int _{u_{1}=-\infty }^{\infty }\cdots \int _{u_{N}=-\infty }^{\infty }f_{C}\left(x_{1}-u_{1},\cdots ,x_{N}-u_{N},t\right)\cdot g_{N}\left(u_{1},\cdots ,u_{N},t\right)\,du_{1}\cdots du_{N}.}</annotation>
</semantics>
</math></span><img src="./96ad0006405babc7c6ea3af15ecdac30fb9644a9.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.671ex; width:98.978ex; height:6.176ex;" alt="{\displaystyle L\left(x_{1},\cdots ,x_{N},t\right)=\int _{u_{1}=-\infty }^{\infty }\cdots \int _{u_{N}=-\infty }^{\infty }f_{C}\left(x_{1}-u_{1},\cdots ,x_{N}-u_{N},t\right)\cdot g_{N}\left(u_{1},\cdots ,u_{N},t\right)\,du_{1}\cdots du_{N}.}" loading="lazy"></span></dd></dl>
<p>However, for <b>implementation</b>, this definition is impractical, since it is continuous. When applying the scale space concept to a discrete signal <i>f<sub>D</sub></i>, different approaches can be taken. This article is a brief summary of some of the most frequently used methods.
</p>
<div class="mw-heading mw-heading2"><h2 id="Separability">Separability</h2></div>
<p>Using the <i>separability property</i> of the Gaussian kernel
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle g_{N}\left(x_{1},\dots ,x_{N},t\right)=G\left(x_{1},t\right)\cdots G\left(x_{N},t\right)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>g</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mrow>
<mo>(</mo>
<mrow>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>,</mo>
<mo>…<!-- … --></mo>
<mo>,</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mo>,</mo>
<mi>t</mi>
</mrow>
<mo>)</mo>
</mrow>
<mo>=</mo>
<mi>G</mi>
<mrow>
<mo>(</mo>
<mrow>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>,</mo>
<mi>t</mi>
</mrow>
<mo>)</mo>
</mrow>
<mo>⋯<!-- ⋯ --></mo>
<mi>G</mi>
<mrow>
<mo>(</mo>
<mrow>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mo>,</mo>
<mi>t</mi>
</mrow>
<mo>)</mo>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle g_{N}\left(x_{1},\dots ,x_{N},t\right)=G\left(x_{1},t\right)\cdots G\left(x_{N},t\right)}</annotation>
</semantics>
</math></span><img src="./f59b7c8277d9d7d8ebc34c6e67ca24a7c3f97e73.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:41.248ex; height:2.843ex;" alt="{\displaystyle g_{N}\left(x_{1},\dots ,x_{N},t\right)=G\left(x_{1},t\right)\cdots G\left(x_{N},t\right)}" loading="lazy"></span></dd></dl>
<p>the <i>N</i>-dimensional <a href="Convolution" title="Convolution">convolution</a> operation can be decomposed into a set of separable smoothing steps with a one-dimensional Gaussian kernel <i>G</i> along each dimension
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle L(x_{1},\cdots ,x_{N},t)=\int _{u_{1}=-\infty }^{\infty }\cdots \int _{u_{N}=-\infty }^{\infty }f_{C}(x_{1}-u_{1},\cdots ,x_{N}-u_{N},t)G(u_{1},t)\,du_{1}\cdots G(u_{N},t)\,du_{N},}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>L</mi>
<mo stretchy="false">(</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>,</mo>
<mo>⋯<!-- ⋯ --></mo>
<mo>,</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<msubsup>
<mo>∫<!-- ∫ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>=</mo>
<mo>−<!-- − --></mo>
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
</msubsup>
<mo>⋯<!-- ⋯ --></mo>
<msubsup>
<mo>∫<!-- ∫ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mo>=</mo>
<mo>−<!-- − --></mo>
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
</msubsup>
<msub>
<mi>f</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>C</mi>
</mrow>
</msub>
<mo stretchy="false">(</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>−<!-- − --></mo>
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>,</mo>
<mo>⋯<!-- ⋯ --></mo>
<mo>,</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mo>−<!-- − --></mo>
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mi>G</mi>
<mo stretchy="false">(</mo>
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mspace width="thinmathspace"></mspace>
<mi>d</mi>
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo>⋯<!-- ⋯ --></mo>
<mi>G</mi>
<mo stretchy="false">(</mo>
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mspace width="thinmathspace"></mspace>
<mi>d</mi>
<msub>
<mi>u</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mo>,</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle L(x_{1},\cdots ,x_{N},t)=\int _{u_{1}=-\infty }^{\infty }\cdots \int _{u_{N}=-\infty }^{\infty }f_{C}(x_{1}-u_{1},\cdots ,x_{N}-u_{N},t)G(u_{1},t)\,du_{1}\cdots G(u_{N},t)\,du_{N},}</annotation>
</semantics>
</math></span><img src="./e9cfa6aa04a2803f3f93e74cecd54e2935a15908.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.671ex; width:95.495ex; height:6.176ex;" alt="{\displaystyle L(x_{1},\cdots ,x_{N},t)=\int _{u_{1}=-\infty }^{\infty }\cdots \int _{u_{N}=-\infty }^{\infty }f_{C}(x_{1}-u_{1},\cdots ,x_{N}-u_{N},t)G(u_{1},t)\,du_{1}\cdots G(u_{N},t)\,du_{N},}" loading="lazy"></span></dd></dl>
<p>where
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle G(x,t)={\frac {1}{\sqrt {2\pi t}}}e^{-{\frac {x^{2}}{2t}}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>G</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<msqrt>
<mn>2</mn>
<mi>π<!-- π --></mi>
<mi>t</mi>
</msqrt>
</mfrac>
</mrow>
<msup>
<mi>e</mi>
<mrow class="MJX-TeXAtom-ORD">
<mo>−<!-- − --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<msup>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msup>
<mrow>
<mn>2</mn>
<mi>t</mi>
</mrow>
</mfrac>
</mrow>
</mrow>
</msup>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle G(x,t)={\frac {1}{\sqrt {2\pi t}}}e^{-{\frac {x^{2}}{2t}}}}</annotation>
</semantics>
</math></span><img src="./405dc6156d5ed1a2a6715b2ebf50b8ad248d03a5.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.838ex; width:21.038ex; height:6.509ex;" alt="{\displaystyle G(x,t)={\frac {1}{\sqrt {2\pi t}}}e^{-{\frac {x^{2}}{2t}}}}" loading="lazy"></span></dd></dl>
<p>and the standard deviation of the Gaussian σ is related to the scale parameter <i>t</i> according to <i>t</i> = σ<sup>2</sup>.
</p><p>Separability will be assumed in all that follows, even when the kernel is not exactly Gaussian, since separation of the dimensions is the most practical way to implement multidimensional smoothing, especially at larger scales. Therefore, <b>the rest of the article focuses on the one-dimensional case.</b>
</p>
<div class="mw-heading mw-heading2"><h2 id="The_sampled_Gaussian_kernel">The sampled Gaussian kernel</h2></div>
<p>When implementing the one-dimensional smoothing step in practice, the presumably simplest approach is to convolve the discrete signal <i>f<sub>D</sub></i> with a <i>sampled Gaussian kernel</i>:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle L(x,t)=\sum _{n=-\infty }^{\infty }f(x-n)\,G(n,t)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>L</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<munderover>
<mo>∑<!-- ∑ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
<mo>=</mo>
<mo>−<!-- − --></mo>
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
</munderover>
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo>−<!-- − --></mo>
<mi>n</mi>
<mo stretchy="false">)</mo>
<mspace width="thinmathspace"></mspace>
<mi>G</mi>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle L(x,t)=\sum _{n=-\infty }^{\infty }f(x-n)\,G(n,t)}</annotation>
</semantics>
</math></span><img src="./b1f485e9de45c6f0ee0a325fef6e754f4f8ed18d.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.005ex; width:31.211ex; height:6.843ex;" alt="{\displaystyle L(x,t)=\sum _{n=-\infty }^{\infty }f(x-n)\,G(n,t)}" loading="lazy"></span></dd></dl>
<p>where
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle G(n,t)={\frac {1}{\sqrt {2\pi t}}}e^{-{\frac {n^{2}}{2t}}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>G</mi>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<msqrt>
<mn>2</mn>
<mi>π<!-- π --></mi>
<mi>t</mi>
</msqrt>
</mfrac>
</mrow>
<msup>
<mi>e</mi>
<mrow class="MJX-TeXAtom-ORD">
<mo>−<!-- − --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<msup>
<mi>n</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msup>
<mrow>
<mn>2</mn>
<mi>t</mi>
</mrow>
</mfrac>
</mrow>
</mrow>
</msup>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle G(n,t)={\frac {1}{\sqrt {2\pi t}}}e^{-{\frac {n^{2}}{2t}}}}</annotation>
</semantics>
</math></span><img src="./8d29037c7fac624fb2938ea5086d025aaf096d78.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.838ex; width:21.141ex; height:6.509ex;" alt="{\displaystyle G(n,t)={\frac {1}{\sqrt {2\pi t}}}e^{-{\frac {n^{2}}{2t}}}}" loading="lazy"></span></dd></dl>
<p>(with <i>t</i> = σ<sup>2</sup>) which in turn is truncated at the ends to give a filter with finite impulse response
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle L(x,t)=\sum _{n=-M}^{M}f(x-n)\,G(n,t)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>L</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<munderover>
<mo>∑<!-- ∑ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
<mo>=</mo>
<mo>−<!-- − --></mo>
<mi>M</mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>M</mi>
</mrow>
</munderover>
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo>−<!-- − --></mo>
<mi>n</mi>
<mo stretchy="false">)</mo>
<mspace width="thinmathspace"></mspace>
<mi>G</mi>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle L(x,t)=\sum _{n=-M}^{M}f(x-n)\,G(n,t)}</annotation>
</semantics>
</math></span><img src="./f4c0472d27fc37afc0858c14d9277f9bd3e55716.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.171ex; width:31.295ex; height:7.509ex;" alt="{\displaystyle L(x,t)=\sum _{n=-M}^{M}f(x-n)\,G(n,t)}" loading="lazy"></span></dd></dl>
<p>for <i>M</i> chosen sufficiently large (see <a href="Error_function" title="Error function">error function</a>) such that
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle 2\int _{M}^{\infty }G(u,t)\,du=2\int _{\frac {M}{\sqrt {t}}}^{\infty }G(v,1)\,dv<\varepsilon .}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mn>2</mn>
<msubsup>
<mo>∫<!-- ∫ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>M</mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
</msubsup>
<mi>G</mi>
<mo stretchy="false">(</mo>
<mi>u</mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mspace width="thinmathspace"></mspace>
<mi>d</mi>
<mi>u</mi>
<mo>=</mo>
<mn>2</mn>
<msubsup>
<mo>∫<!-- ∫ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mi>M</mi>
<msqrt>
<mi>t</mi>
</msqrt>
</mfrac>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
</msubsup>
<mi>G</mi>
<mo stretchy="false">(</mo>
<mi>v</mi>
<mo>,</mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mspace width="thinmathspace"></mspace>
<mi>d</mi>
<mi>v</mi>
<mo><</mo>
<mi>ε<!-- ε --></mi>
<mo>.</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle 2\int _{M}^{\infty }G(u,t)\,du=2\int _{\frac {M}{\sqrt {t}}}^{\infty }G(v,1)\,dv<\varepsilon .}</annotation>
</semantics>
</math></span><img src="./6f27909633aa79fb5fecf79574153da9e2482514.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.838ex; width:39.942ex; height:7.343ex;" alt="{\displaystyle 2\int _{M}^{\infty }G(u,t)\,du=2\int _{\frac {M}{\sqrt {t}}}^{\infty }G(v,1)\,dv<\varepsilon .}" loading="lazy"></span></dd></dl>
<p>A common choice is to set <i>M</i> to a constant <i>C</i> times the standard deviation of the Gaussian kernel
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle M=C\sigma +1=C{\sqrt {t}}+1}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>M</mi>
<mo>=</mo>
<mi>C</mi>
<mi>σ<!-- σ --></mi>
<mo>+</mo>
<mn>1</mn>
<mo>=</mo>
<mi>C</mi>
<mrow class="MJX-TeXAtom-ORD">
<msqrt>
<mi>t</mi>
</msqrt>
</mrow>
<mo>+</mo>
<mn>1</mn>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle M=C\sigma +1=C{\sqrt {t}}+1}</annotation>
</semantics>
</math></span><img src="./78b7e85ff335e365a112d09398c3e5234ce38cd6.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:24.283ex; height:3.009ex;" alt="{\displaystyle M=C\sigma +1=C{\sqrt {t}}+1}" loading="lazy"></span></dd></dl>
<p>where <i>C</i> is often chosen somewhere between 3 and 6.
</p><p>Using the sampled Gaussian kernel can, however, lead to implementation problems, in particular when computing higher-order derivatives at finer scales by applying sampled derivatives of Gaussian kernels. When accuracy and robustness are primary design criteria, alternative implementation approaches should therefore be considered.
</p><p>For small values of ε (10<sup>−6</sup> to 10<sup>−8</sup>) the errors introduced by truncating the Gaussian are usually negligible. For larger values of ε, however, there are many better alternatives to a rectangular <a href="Window_function" title="Window function">window function</a>. For example, for a given number of points, a <a href="Hamming_window" class="mw-redirect" title="Hamming window">Hamming window</a>, <a href="Blackman_window" class="mw-redirect" title="Blackman window">Blackman window</a>, or <a href="Kaiser_window" title="Kaiser window">Kaiser window</a> will do less damage to the spectral and other properties of the Gaussian than a simple truncation will. Notwithstanding this, since the Gaussian kernel decreases rapidly at the tails, the main recommendation is still to use a sufficiently small value of ε such that the truncation effects are no longer important.
</p>
<div class="mw-heading mw-heading2"><h2 id="The_discrete_Gaussian_kernel">The discrete Gaussian kernel</h2></div>
<p>A more refined approach is to convolve the original signal with the <i>discrete Gaussian kernel</i> <i>T</i>(<i>n</i>, <i>t</i>)<sup id="cite_ref-tpl90_3-0" class="reference"><a href="#cite_note-tpl90-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-lin94_4-0" class="reference"><a href="#cite_note-lin94-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-HaddadAkansu_5-0" class="reference"><a href="#cite_note-HaddadAkansu-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle L(x,t)=\sum _{n=-\infty }^{\infty }f(x-n)\,T(n,t)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>L</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<munderover>
<mo>∑<!-- ∑ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
<mo>=</mo>
<mo>−<!-- − --></mo>
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
</munderover>
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo>−<!-- − --></mo>
<mi>n</mi>
<mo stretchy="false">)</mo>
<mspace width="thinmathspace"></mspace>
<mi>T</mi>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle L(x,t)=\sum _{n=-\infty }^{\infty }f(x-n)\,T(n,t)}</annotation>
</semantics>
</math></span><img src="./4a5ff3f77d2b8c4b45a75f03e572751188185fdb.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.005ex; width:31.021ex; height:6.843ex;" alt="{\displaystyle L(x,t)=\sum _{n=-\infty }^{\infty }f(x-n)\,T(n,t)}" loading="lazy"></span></dd></dl>
<p>where
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle T(n,t)=e^{-t}I_{n}(t)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>T</mi>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<msup>
<mi>e</mi>
<mrow class="MJX-TeXAtom-ORD">
<mo>−<!-- − --></mo>
<mi>t</mi>
</mrow>
</msup>
<msub>
<mi>I</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
<mo stretchy="false">(</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle T(n,t)=e^{-t}I_{n}(t)}</annotation>
</semantics>
</math></span><img src="./2a192da6a8d7eb5f2e40a94bbd1465b0c03014df.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:17.891ex; height:3.009ex;" alt="{\displaystyle T(n,t)=e^{-t}I_{n}(t)}" loading="lazy"></span></dd></dl>
<p>and <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle I_{n}(t)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>I</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
</mrow>
</msub>
<mo stretchy="false">(</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle I_{n}(t)}</annotation>
</semantics>
</math></span><img src="./f5330f8efe654b11ae57849d376898006b123144.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:4.89ex; height:2.843ex;" alt="{\displaystyle I_{n}(t)}" loading="lazy"></span> denotes the <a href="Modified_Bessel_function" class="mw-redirect" title="Modified Bessel function">modified Bessel functions</a> of integer order, <i>n</i>. This is the discrete counterpart of the continuous Gaussian in that it is the solution to the discrete <a href="Diffusion_equation" title="Diffusion equation">diffusion equation</a> (discrete space, continuous time), just as the continuous Gaussian is the solution to the continuous diffusion equation.<sup id="cite_ref-tpl90_3-1" class="reference"><a href="#cite_note-tpl90-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-lin94_4-1" class="reference"><a href="#cite_note-lin94-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup>
</p><p>This filter can be truncated in the spatial domain as for the sampled Gaussian
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle L(x,t)=\sum _{n=-M}^{M}f(x-n)\,T(n,t)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>L</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<munderover>
<mo>∑<!-- ∑ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
<mo>=</mo>
<mo>−<!-- − --></mo>
<mi>M</mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>M</mi>
</mrow>
</munderover>
<mi>f</mi>
<mo stretchy="false">(</mo>
<mi>x</mi>
<mo>−<!-- − --></mo>
<mi>n</mi>
<mo stretchy="false">)</mo>
<mspace width="thinmathspace"></mspace>
<mi>T</mi>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle L(x,t)=\sum _{n=-M}^{M}f(x-n)\,T(n,t)}</annotation>
</semantics>
</math></span><img src="./8140276fbc83ea8c764e33881a1cbcaf56cc6446.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.171ex; width:31.105ex; height:7.509ex;" alt="{\displaystyle L(x,t)=\sum _{n=-M}^{M}f(x-n)\,T(n,t)}" loading="lazy"></span></dd></dl>
<p>or can be implemented in the Fourier domain using a closed-form expression for its <a href="Discrete-time_Fourier_transform" title="Discrete-time Fourier transform">discrete-time Fourier transform</a>:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\widehat {T}}(\theta ,t)=\sum _{n=-\infty }^{\infty }T(n,t)\,e^{-i\theta n}=e^{t(\cos \theta -1)}.}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mrow class="MJX-TeXAtom-ORD">
<mover>
<mi>T</mi>
<mo>^<!-- ^ --></mo>
</mover>
</mrow>
</mrow>
<mo stretchy="false">(</mo>
<mi>θ<!-- θ --></mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<munderover>
<mo>∑<!-- ∑ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>n</mi>
<mo>=</mo>
<mo>−<!-- − --></mo>
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
</munderover>
<mi>T</mi>
<mo stretchy="false">(</mo>
<mi>n</mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mspace width="thinmathspace"></mspace>
<msup>
<mi>e</mi>
<mrow class="MJX-TeXAtom-ORD">
<mo>−<!-- − --></mo>
<mi>i</mi>
<mi>θ<!-- θ --></mi>
<mi>n</mi>
</mrow>
</msup>
<mo>=</mo>
<msup>
<mi>e</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>t</mi>
<mo stretchy="false">(</mo>
<mi>cos</mi>
<mo><!-- --></mo>
<mi>θ<!-- θ --></mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
</mrow>
</msup>
<mo>.</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\widehat {T}}(\theta ,t)=\sum _{n=-\infty }^{\infty }T(n,t)\,e^{-i\theta n}=e^{t(\cos \theta -1)}.}</annotation>
</semantics>
</math></span><img src="./9ff6658ecd3016fe3e00339ddf6afe66e7ca9d22.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.005ex; width:39.697ex; height:6.843ex;" alt="{\displaystyle {\widehat {T}}(\theta ,t)=\sum _{n=-\infty }^{\infty }T(n,t)\,e^{-i\theta n}=e^{t(\cos \theta -1)}.}" loading="lazy"></span></dd></dl>
<p>With this frequency-domain approach, the scale-space properties transfer <i>exactly</i> to the discrete domain, or with excellent approximation using periodic extension and a suitably long <a href="Discrete_Fourier_transform" title="Discrete Fourier transform">discrete Fourier transform</a> to approximate the <a href="Discrete-time_Fourier_transform" title="Discrete-time Fourier transform">discrete-time Fourier transform</a> of the signal being smoothed. Moreover, higher-order derivative approximations can be computed in a straightforward manner (and preserving scale-space properties) by applying small support central difference operators to the discrete <a href="Scale_space_representation" class="mw-redirect" title="Scale space representation">scale space representation</a>.<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup>
</p><p>As with the sampled Gaussian, a plain truncation of the infinite impulse response will in most cases be a sufficient approximation for small values of ε, while for larger values of ε it is better to use either a decomposition of the discrete Gaussian into a cascade of generalized binomial filters or alternatively to construct a finite approximate kernel by multiplying by a <a href="Window_function" title="Window function">window function</a>. If ε has been chosen too large such that effects of the truncation error begin to appear (for example as spurious extrema or spurious responses to higher-order derivative operators), then the options are to decrease the value of ε such that a larger finite kernel is used, with cutoff where the support is very small, or to use a tapered window.
</p>
<div class="mw-heading mw-heading2"><h2 id="Recursive_filters">Recursive filters</h2></div>
<p>Since computational efficiency is often important, low-order <i><a href="Recursive_filter" title="Recursive filter">recursive filters</a></i> are often used for scale-space smoothing. For example, Young and van Vliet<sup id="cite_ref-young_8-0" class="reference"><a href="#cite_note-young-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup> use a third-order recursive filter with one real <a href="Pole_(complex_analysis)" class="mw-redirect" title="Pole (complex analysis)">pole</a> and a pair of complex poles, applied forward and backward to make a sixth-order symmetric approximation to the Gaussian with low computational complexity for any smoothing scale.
</p><p>By relaxing a few of the axioms, Lindeberg<sup id="cite_ref-tpl90_3-2" class="reference"><a href="#cite_note-tpl90-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> concluded that good smoothing filters would be "normalized <a href="George_P%C3%B3lya" title="George Pólya">Pólya</a> frequency sequences", a family of discrete kernels that includes all filters with real poles at 0 < <i>Z</i> < 1 and/or <i>Z</i> > 1, as well as with real <a href="Zero_(complex_analysis)" class="mw-redirect" title="Zero (complex analysis)">zeros</a> at <i>Z</i> < 0. For symmetry, which leads to approximate directional homogeneity, these filters must be further restricted to pairs of poles and zeros that lead to zero-phase filters.
</p><p>To match the transfer function curvature at zero frequency of the discrete Gaussian, which ensures an approximate <a href="Semi-group" class="mw-redirect" title="Semi-group">semi-group</a> property of additive <i>t</i>, two poles at
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle Z=1+{\frac {2}{t}}-{\sqrt {\left(1+{\frac {2}{t}}\right)^{2}-1}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>Z</mi>
<mo>=</mo>
<mn>1</mn>
<mo>+</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>2</mn>
<mi>t</mi>
</mfrac>
</mrow>
<mo>−<!-- − --></mo>
<mrow class="MJX-TeXAtom-ORD">
<msqrt>
<msup>
<mrow>
<mo>(</mo>
<mrow>
<mn>1</mn>
<mo>+</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>2</mn>
<mi>t</mi>
</mfrac>
</mrow>
</mrow>
<mo>)</mo>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msup>
<mo>−<!-- − --></mo>
<mn>1</mn>
</msqrt>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle Z=1+{\frac {2}{t}}-{\sqrt {\left(1+{\frac {2}{t}}\right)^{2}-1}}}</annotation>
</semantics>
</math></span><img src="./c34852ea9492059995edbb69f4239923454bf157.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.005ex; width:30.424ex; height:7.676ex;" alt="{\displaystyle Z=1+{\frac {2}{t}}-{\sqrt {\left(1+{\frac {2}{t}}\right)^{2}-1}}}" loading="lazy"></span></dd></dl>
<p>can be applied forward and backwards, for symmetry and stability. This filter is the simplest implementation of a normalized Pólya frequency sequence kernel that works for any smoothing scale, but it is not as excellent an approximation to the Gaussian as Young and van Vliet's filter, which is <i>not</i> normalized Pólya frequency sequence, due to its complex poles.
</p><p>The transfer function, <i>H</i><sub>1</sub>, of a symmetric pole-pair recursive filter is closely related to the <a href="Discrete-time_Fourier_transform" title="Discrete-time Fourier transform">discrete-time Fourier transform</a> of the discrete Gaussian kernel via first-order approximation of the exponential:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\widehat {T}}(\theta ,t)={\frac {1}{e^{t(1-\cos \theta )}}}\approx {\frac {1}{1+t(1-\cos \theta )}}=H_{1}(\theta ,t),}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mrow class="MJX-TeXAtom-ORD">
<mover>
<mi>T</mi>
<mo>^<!-- ^ --></mo>
</mover>
</mrow>
</mrow>
<mo stretchy="false">(</mo>
<mi>θ<!-- θ --></mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<msup>
<mi>e</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>t</mi>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mi>cos</mi>
<mo><!-- --></mo>
<mi>θ<!-- θ --></mi>
<mo stretchy="false">)</mo>
</mrow>
</msup>
</mfrac>
</mrow>
<mo>≈<!-- ≈ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<mrow>
<mn>1</mn>
<mo>+</mo>
<mi>t</mi>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mi>cos</mi>
<mo><!-- --></mo>
<mi>θ<!-- θ --></mi>
<mo stretchy="false">)</mo>
</mrow>
</mfrac>
</mrow>
<mo>=</mo>
<msub>
<mi>H</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo stretchy="false">(</mo>
<mi>θ<!-- θ --></mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>,</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\widehat {T}}(\theta ,t)={\frac {1}{e^{t(1-\cos \theta )}}}\approx {\frac {1}{1+t(1-\cos \theta )}}=H_{1}(\theta ,t),}</annotation>
</semantics>
</math></span><img src="./86574bf8be9cba759efcc457282fc947e853f4cd.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.671ex; width:49.876ex; height:6.009ex;" alt="{\displaystyle {\widehat {T}}(\theta ,t)={\frac {1}{e^{t(1-\cos \theta )}}}\approx {\frac {1}{1+t(1-\cos \theta )}}=H_{1}(\theta ,t),}" loading="lazy"></span></dd></dl>
<p>where the <i>t</i> parameter here is related to the stable pole position <i>Z</i> = <i>p</i> via:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle t={\frac {2p}{(1-p)^{2}}}.}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>t</mi>
<mo>=</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mrow>
<mn>2</mn>
<mi>p</mi>
</mrow>
<mrow>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mi>p</mi>
<msup>
<mo stretchy="false">)</mo>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msup>
</mrow>
</mfrac>
</mrow>
<mo>.</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle t={\frac {2p}{(1-p)^{2}}}.}</annotation>
</semantics>
</math></span><img src="./4ec4e5ae74078d03de90187a1d6ec600cb2ff8f4.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.671ex; width:13.457ex; height:6.176ex;" alt="{\displaystyle t={\frac {2p}{(1-p)^{2}}}.}" loading="lazy"></span></dd></dl>
<p>Furthermore, such filters with <i>N</i> pairs of poles, such as the two pole pairs illustrated in this section, are an even better approximation to the exponential:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\frac {1}{\left(1+{\frac {t}{N}}(1-\cos \theta )\right)^{N}}}=H_{N}(\theta ,t),}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mn>1</mn>
<msup>
<mrow>
<mo>(</mo>
<mrow>
<mn>1</mn>
<mo>+</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mi>t</mi>
<mi>N</mi>
</mfrac>
</mrow>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mi>cos</mi>
<mo><!-- --></mo>
<mi>θ<!-- θ --></mi>
<mo stretchy="false">)</mo>
</mrow>
<mo>)</mo>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msup>
</mfrac>
</mrow>
<mo>=</mo>
<msub>
<mi>H</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mo stretchy="false">(</mo>
<mi>θ<!-- θ --></mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>,</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\frac {1}{\left(1+{\frac {t}{N}}(1-\cos \theta )\right)^{N}}}=H_{N}(\theta ,t),}</annotation>
</semantics>
</math></span><img src="./db168149033ae93902bff2cb2fb6103a50cf2e48.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -5.005ex; width:34.143ex; height:8.343ex;" alt="{\displaystyle {\frac {1}{\left(1+{\frac {t}{N}}(1-\cos \theta )\right)^{N}}}=H_{N}(\theta ,t),}" loading="lazy"></span></dd></dl>
<p>where the stable pole positions are adjusted by solving:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\frac {t}{N}}={\frac {2p}{(1-p)^{2}}}.}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mi>t</mi>
<mi>N</mi>
</mfrac>
</mrow>
<mo>=</mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mrow>
<mn>2</mn>
<mi>p</mi>
</mrow>
<mrow>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mi>p</mi>
<msup>
<mo stretchy="false">)</mo>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msup>
</mrow>
</mfrac>
</mrow>
<mo>.</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\frac {t}{N}}={\frac {2p}{(1-p)^{2}}}.}</annotation>
</semantics>
</math></span><img src="./d1f56d4659f46d3187db6c31d19da98a49da247c.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.671ex; width:15.517ex; height:6.176ex;" alt="{\displaystyle {\frac {t}{N}}={\frac {2p}{(1-p)^{2}}}.}" loading="lazy"></span></dd></dl>
<p>The impulse responses of these filters are not very close to gaussian unless more than two pole pairs are used. However, even with only one or two pole pairs per scale, a signal successively smoothed at increasing scales will be very close to a gaussian-smoothed signal. The semi-group property is poorly approximated when too few pole pairs are used.
</p><p><a href="Scale-space_axioms" title="Scale-space axioms">Scale-space axioms</a> that are still satisfied by these filters are:
</p>
<ul><li><i>linearity</i></li>
<li><i>shift invariance</i> (integer shifts)</li>
<li><i>non-creation of local extrema</i> (zero-crossings) in one dimension</li>
<li><i>non-enhancement of local extrema</i> in any number of dimensions</li>
<li><i>positivity</i></li>
<li><i>normalization</i></li></ul>
<p>The following are only approximately satisfied, the approximation being better for larger numbers of pole pairs:
</p>
<ul><li>existence of an <i>infinitesimal generator</i> <i>A</i> (the infinitesimal generator of the discrete Gaussian, or a filter approximating it, approximately maps a recursive filter response to one of infinitesimally larger <i>t</i>)</li>
<li>the <i>semi-group structure</i> with the associated <i>cascade smoothing property</i> (this property is approximated by considering kernels to be equivalent when they have the same <i>t</i> value, even if they are not quite equal)</li>
<li><i>rotational symmetry</i></li>
<li><i>scale invariance</i></li></ul>
<p>This recursive filter method and variations to compute both the Gaussian smoothing as well as Gaussian derivatives has been described by several authors.<sup id="cite_ref-young_8-1" class="reference"><a href="#cite_note-young-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-10" class="reference"><a href="#cite_note-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-11" class="reference"><a href="#cite_note-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup> Tan <i>et al.</i> have analyzed and compared some of these approaches, and have pointed out that the Young and van Vliet filters are a cascade (multiplication) of forward and backward filters, while the Deriche and the Jin <i>et al.</i> filters are sums of forward and backward filters.<sup id="cite_ref-12" class="reference"><a href="#cite_note-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup>
</p><p>At fine scales, the recursive filtering approach as well as other separable approaches are not guaranteed to give the best possible approximation to rotational symmetry, so non-separable implementations for 2D images may be considered as an alternative.
</p><p>When computing several derivatives in the <a href="N-jet" title="N-jet">N-jet</a> simultaneously, discrete scale-space smoothing with the discrete analogue of the Gaussian kernel, or with a recursive filter approximation, followed by small support difference operators, may be both faster and more accurate than computing recursive approximations of each derivative operator.
</p>
<div class="mw-heading mw-heading2"><h2 id="Finite-impulse-response_(FIR)_smoothers">Finite-impulse-response (FIR) smoothers</h2></div>
<p>For small scales, a low-order <a href="FIR_filter" class="mw-redirect" title="FIR filter">FIR filter</a> may be a better smoothing filter than a recursive filter. The symmetric 3-kernel <span class="nowrap">[<i>t</i>/2, 1-<i>t</i>, <i>t</i>/2]</span>, for <i>t</i> ≤ 0.5 smooths to a scale of <i>t</i> using a pair of real zeros at <i>Z</i> < 0, and approaches the discrete Gaussian in the limit of small <i>t</i>. In fact, with infinitesimal <i>t</i>, either this two-zero filter or the two-pole filter with poles at <i>Z</i> = <i>t</i>/2 and <i>Z</i> = 2/<i>t</i> can be used as the infinitesimal generator for the discrete Gaussian kernels described above.
</p><p>The FIR filter's zeros can be combined with the recursive filter's poles to make a general high-quality smoothing filter. For example, if the smoothing process is to always apply a <a href="Biquad" class="mw-redirect" title="Biquad">biquad</a> (two-pole, two-zero) filter forward then backwards on each row of data (and on each column in the 2D case), the poles and zeros can each do a part of the smoothing. The zeros limit out at <i>t</i> = 0.5 per pair (zeros at <i>Z</i> = –1), so for large scales the poles do most of the work. At finer scales, the combination makes an excellent approximation to the discrete Gaussian if the poles and zeros each do about half the smoothing. The <i>t</i> values for each portion of the smoothing (poles, zeros, forward and backward multiple applications, etc.) are additive, in accordance with the approximate semi-group property.
</p>
<p>The FIR filter transfer function is closely related to the discrete Gaussian's DTFT, just as was the recursive filter's. For a single pair of zeros, the transfer function is
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\widehat {T}}(\theta ,t)=e^{-t(1-\cos \theta )}\approx {1-t(1-\cos \theta )}=F_{1}(\theta ,t),}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mrow class="MJX-TeXAtom-ORD">
<mover>
<mi>T</mi>
<mo>^<!-- ^ --></mo>
</mover>
</mrow>
</mrow>
<mo stretchy="false">(</mo>
<mi>θ<!-- θ --></mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<msup>
<mi>e</mi>
<mrow class="MJX-TeXAtom-ORD">
<mo>−<!-- − --></mo>
<mi>t</mi>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mi>cos</mi>
<mo><!-- --></mo>
<mi>θ<!-- θ --></mi>
<mo stretchy="false">)</mo>
</mrow>
</msup>
<mo>≈<!-- ≈ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
<mo>−<!-- − --></mo>
<mi>t</mi>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mi>cos</mi>
<mo><!-- --></mo>
<mi>θ<!-- θ --></mi>
<mo stretchy="false">)</mo>
</mrow>
<mo>=</mo>
<msub>
<mi>F</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>1</mn>
</mrow>
</msub>
<mo stretchy="false">(</mo>
<mi>θ<!-- θ --></mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>,</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\widehat {T}}(\theta ,t)=e^{-t(1-\cos \theta )}\approx {1-t(1-\cos \theta )}=F_{1}(\theta ,t),}</annotation>
</semantics>
</math></span><img src="./fd71db468be5382edced5a673cfcfcf92fda01f3.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:49.046ex; height:3.343ex;" alt="{\displaystyle {\widehat {T}}(\theta ,t)=e^{-t(1-\cos \theta )}\approx {1-t(1-\cos \theta )}=F_{1}(\theta ,t),}" loading="lazy"></span></dd></dl>
<p>where the <i>t</i> parameter here is related to the zero positions <i>Z</i> = <i>z</i> via:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle t=-{\frac {2z}{(1-z)^{2}}},}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>t</mi>
<mo>=</mo>
<mo>−<!-- − --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mrow>
<mn>2</mn>
<mi>z</mi>
</mrow>
<mrow>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mi>z</mi>
<msup>
<mo stretchy="false">)</mo>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msup>
</mrow>
</mfrac>
</mrow>
<mo>,</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle t=-{\frac {2z}{(1-z)^{2}}},}</annotation>
</semantics>
</math></span><img src="./7d60c2b10a87ccf5e44506f4a69fa8c5aa698c2e.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.671ex; width:15.184ex; height:6.009ex;" alt="{\displaystyle t=-{\frac {2z}{(1-z)^{2}}},}" loading="lazy"></span></dd></dl>
<p>and we require <i>t</i> ≤ 0.5 to keep the transfer function non-negative.
</p><p>Furthermore, such filters with <i>N</i> pairs of zeros, are an even better approximation to the exponential and extend to higher values of <i>t</i> :
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \left(1-{\frac {t}{N}}(1-\cos \theta )\right)^{N}=F_{N}(\theta ,t),}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msup>
<mrow>
<mo>(</mo>
<mrow>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mi>t</mi>
<mi>N</mi>
</mfrac>
</mrow>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mi>cos</mi>
<mo><!-- --></mo>
<mi>θ<!-- θ --></mi>
<mo stretchy="false">)</mo>
</mrow>
<mo>)</mo>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msup>
<mo>=</mo>
<msub>
<mi>F</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mo stretchy="false">(</mo>
<mi>θ<!-- θ --></mi>
<mo>,</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>,</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \left(1-{\frac {t}{N}}(1-\cos \theta )\right)^{N}=F_{N}(\theta ,t),}</annotation>
</semantics>
</math></span><img src="./90055004602c5d3240f007e367f900e46d2decfc.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.505ex; width:34.121ex; height:6.676ex;" alt="{\displaystyle \left(1-{\frac {t}{N}}(1-\cos \theta )\right)^{N}=F_{N}(\theta ,t),}" loading="lazy"></span></dd></dl>
<p>where the stable zero positions are adjusted by solving:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\frac {t}{N}}=-{\frac {2z}{(1-z)^{2}}}.}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mi>t</mi>
<mi>N</mi>
</mfrac>
</mrow>
<mo>=</mo>
<mo>−<!-- − --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mrow>
<mn>2</mn>
<mi>z</mi>
</mrow>
<mrow>
<mo stretchy="false">(</mo>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mi>z</mi>
<msup>
<mo stretchy="false">)</mo>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msup>
</mrow>
</mfrac>
</mrow>
<mo>.</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\frac {t}{N}}=-{\frac {2z}{(1-z)^{2}}}.}</annotation>
</semantics>
</math></span><img src="./744608492b42f9f272f882b641140b1c35651907.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.671ex; width:17.244ex; height:6.009ex;" alt="{\displaystyle {\frac {t}{N}}=-{\frac {2z}{(1-z)^{2}}}.}" loading="lazy"></span></dd></dl>
<p>These FIR and pole-zero filters are valid scale-space kernels, satisfying the same axioms as the all-pole recursive filters.
</p>
<div class="mw-heading mw-heading2"><h2 id="Real-time_implementation_within_pyramids_and_discrete_approximation_of_scale-normalized_derivatives">Real-time implementation within pyramids and discrete approximation of scale-normalized derivatives</h2></div>
<p>Regarding the topic of automatic scale selection based on normalized derivatives, <a href="Pyramid_(image_processing)" title="Pyramid (image processing)">pyramid approximations</a> are frequently used to obtain real-time performance.<sup id="cite_ref-13" class="reference"><a href="#cite_note-13"><span class="cite-bracket">[</span>13<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-14" class="reference"><a href="#cite_note-14"><span class="cite-bracket">[</span>14<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-15" class="reference"><a href="#cite_note-15"><span class="cite-bracket">[</span>15<span class="cite-bracket">]</span></a></sup> The appropriateness of approximating scale-space operations within a pyramid originates from the fact that repeated cascade smoothing with generalized binomial kernels leads to equivalent smoothing kernels that under reasonable conditions approach the Gaussian. Furthermore, the binomial kernels (or more generally the class of generalized binomial kernels) can be shown to constitute the unique class of finite-support kernels that guarantee non-creation of local extrema or zero-crossings with increasing scale (see the article on <a href="Multi-scale_approaches" title="Multi-scale approaches">multi-scale approaches</a> for details). Special care may, however, need to be taken to avoid discretization artifacts.
</p>
<div class="mw-heading mw-heading2"><h2 id="Other_multi-scale_approaches">Other multi-scale approaches</h2></div>
<p>For one-dimensional kernels, there is a well-developed theory of <a href="Multi-scale_approaches" title="Multi-scale approaches">multi-scale approaches</a>, concerning filters that do not create new local extrema or new zero-crossings with increasing scales. For continuous signals, filters with real poles in the <i>s</i>-plane are within this class, while for discrete signals the above-described recursive and FIR filters satisfy these criteria. Combined with the strict requirement of a continuous semi-group structure, the continuous Gaussian and the discrete Gaussian constitute the unique choice for continuous and discrete signals.
</p><p>There are many other multi-scale signal processing, image processing and data compression techniques, using <a href="Wavelets" class="mw-redirect" title="Wavelets">wavelets</a> and a variety of other kernels, that do not exploit or require the <a href="Scale-space_axioms" title="Scale-space axioms">same requirements</a> as <a href="Scale_space" title="Scale space">scale space</a> descriptions do; that is, they do not depend on a coarser scale not generating a new extremum that was not present at a finer scale (in 1D) or non-enhancement of local extrema between adjacent scale levels (in any number of dimensions).
</p>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<ul><li><a href="Scale_space" title="Scale space">Scale space</a></li>
<li><a href="Pyramid_(image_processing)" title="Pyramid (image processing)">Pyramid (image processing)</a></li>
<li><a href="Multi-scale_approaches" title="Multi-scale approaches">Multi-scale approaches</a></li>
<li><a href="Gaussian_filter" title="Gaussian filter">Gaussian filter</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li><a rel="nofollow" class="external text" href="https://github.com/tonylindeberg/pyscsp">pyscsp: Scale-space toolbox for Python at GitHub (including implementations of different methods for approximating Gaussian smoothing for discrete data)</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<div class="mw-references-wrap mw-references-columns"><ol class="references">
<li id="cite_note-Lin24-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-Lin24_1-0">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://doi.org/10.1007/s10851-024-01196-9">Lindeberg, T., "Discrete approximations of Gaussian smoothing and Gaussian derivatives," Journal of Mathematical Imaging and Vision, 66(5): 759–800, 2024.</a></span>
</li>
<li id="cite_note-Lin25-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-Lin25_2-0">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://doi.org/10.3389/frsip.2024.1447841">Lindeberg (2025) ”Approximation properties relative to continuous scale space for hybrid discretizations of Gaussian derivative operators”, Frontiers in Signal Processing, 4: 144784: 1-12.</a></span>
</li>
<li id="cite_note-tpl90-3"><span class="mw-cite-backlink">^ <a href="#cite_ref-tpl90_3-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-tpl90_3-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-tpl90_3-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://kth.diva-portal.org/smash/record.jsf?pid=diva2%3A472968&dswid=3087">Lindeberg, T., "Scale-space for discrete signals," PAMI(12), No. 3, March 1990, pp. 234-254.</a></span>
</li>
<li id="cite_note-lin94-4"><span class="mw-cite-backlink">^ <a href="#cite_ref-lin94_4-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-lin94_4-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.csc.kth.se/~tony/book.html">Lindeberg, T., Scale-Space Theory in Computer Vision, Kluwer Academic Publishers, 1994</a>, <style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */
.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}
/* end https://en.wikipedia.org/ */
</style><a href="ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a> <bdi>0-7923-9418-6</bdi></span>
</li>
<li id="cite_note-HaddadAkansu-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-HaddadAkansu_5-0">^</a></b></span> <span class="reference-text">R.A. Haddad and A.N. Akansu, "<a rel="nofollow" class="external text" href="https://web.njit.edu/~akansu/PAPERS/Haddad-AkansuFastGaussianBinomialFiltersIEEE-TSP-March1991.pdf">A Class of Fast Gaussian Binomial Filters for Speech and Image Processing</a>," IEEE Transactions on Acoustics, Speech, and Signal Processing, vol. 39, pp 723-727, March 1991.</span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-6">^</a></b></span> <span class="reference-text">Campbell, J, 2007, <i><a rel="nofollow" class="external text" href="https://dx.doi.org/10.1016/j.tpb.2007.08.001">The SMM model as a boundary value problem using the discrete diffusion equation</a></i>, Theor Popul Biol. 2007 Dec;72(4):539-46.</span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-7">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://kth.diva-portal.org/smash/record.jsf?pid=diva2%3A473368&dswid=1120">Lindeberg, T. Discrete derivative approximations with scale-space properties: A basis for low-level feature extraction, J. of Mathematical Imaging and Vision, 3(4), pp. 349--376, 1993.</a></span>
</li>
<li id="cite_note-young-8"><span class="mw-cite-backlink">^ <a href="#cite_ref-young_8-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-young_8-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><cite id="CITEREFIan_T._YoungLucas_J._van_Vliet1995" class="citation journal cs1">Ian T. Young & Lucas J. van Vliet (1995). <a rel="nofollow" class="external text" href="http://citeseer.ist.psu.edu/young95recursive.html">"Recursive implementation of the Gaussian filter"</a>. <i>Signal Processing</i>. <b>44</b> (2): <span class="nowrap">139–</span>151. <a href="Bibcode_(identifier)" class="mw-redirect" title="Bibcode (identifier)">Bibcode</a>:<a rel="nofollow" class="external text" href="https://ui.adsabs.harvard.edu/abs/1995SigPr..44..139Y">1995SigPr..44..139Y</a>. <a href="CiteSeerX_(identifier)" class="mw-redirect" title="CiteSeerX (identifier)">CiteSeerX</a> <span class="id-lock-free" title="Freely accessible"><a rel="nofollow" class="external text" href="https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.12.2826">10.1.1.12.2826</a></span>. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1016%2F0165-1684%2895%2900020-E">10.1016/0165-1684(95)00020-E</a>.</cite></span>
</li>
<li id="cite_note-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-9">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://citeseer.ist.psu.edu/deriche93recursively.html">Deriche, R: Recursively implementing the Gaussian and its derivatives, INRIA Research Report 1893, 1993.</a></span>
</li>
<li id="cite_note-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-10">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.dicklyon.com/tech/Scans/ICASSP87_ScaleSpace-Lyon.pdf">Richard F. Lyon. "Speech recognition in scale space," Proc. of 1987 ICASSP. San Diego, March, pp. 29.3.14, 1987.</a></span>
</li>
<li id="cite_note-11"><span class="mw-cite-backlink"><b><a href="#cite_ref-11">^</a></b></span> <span class="reference-text">Jin, JS, Gao Y. "Recursive implementation of LoG Filtering". <i>Real-Time Imaging</i> 1997;3:59–65.</span>
</li>
<li id="cite_note-12"><span class="mw-cite-backlink"><b><a href="#cite_ref-12">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.pspc.dibe.unige.it/ecovision/pubs/papers/tan-dale-johnston.pdf">.</a> <cite id="CITEREFSovira_TanJason_L._DaleAlan_Johnston2003" class="citation magazine cs1">Sovira Tan; Jason L. Dale & Alan Johnston (2003). "Performance of three recursive algorithms for fast space-variant Gaussian filtering". <i>Real-Time Imaging</i>. Vol. 9, no. 3. pp. <span class="nowrap">215–</span>228. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1016%2FS1077-2014%2803%2900040-8">10.1016/S1077-2014(03)00040-8</a>.</cite></span>
</li>
<li id="cite_note-13"><span class="mw-cite-backlink"><b><a href="#cite_ref-13">^</a></b></span> <span class="reference-text"><cite id="CITEREFLindeberg,_TonyBretzner,_Lars2003" class="citation book cs1">Lindeberg, Tony & Bretzner, Lars (2003). "Real-Time Scale Selection in Hybrid Multi-scale Representations". <a rel="nofollow" class="external text" href="http://kth.diva-portal.org/smash/record.jsf?pid=diva2%3A440700&dswid=227"><i>Scale Space Methods in Computer Vision</i></a>. Lecture Notes in Computer Science. Vol. 2695. Proc. Scale-Space'03, Springer Lecture Notes in Computer Science. pp. <span class="nowrap">148–</span>163. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1007%2F3-540-44935-3_11">10.1007/3-540-44935-3_11</a>. <a href="ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a> <bdi>978-3-540-40368-5</bdi>.</cite></span>
</li>
<li id="cite_note-14"><span class="mw-cite-backlink"><b><a href="#cite_ref-14">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www-prima.inrialpes.fr/Prima/Homepages/jlc/papers/Crowley-ScaleSpace03.pdf">Crowley, J, Riff O: Fast computation of scale normalised Gaussian receptive fields, Proc. Scale-Space'03, Isle of Skye, Scotland, Springer Lecture Notes in Computer Science, volume 2695, 2003.</a></span>
</li>
<li id="cite_note-15"><span class="mw-cite-backlink"><b><a href="#cite_ref-15">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://citeseer.ist.psu.edu/lowe04distinctive.html">Lowe, D. G., “Distinctive image features from scale-invariant keypoints”, International Journal of Computer Vision, 60, 2, pp. 91-110, 2004.</a></span>
</li>
</ol></div></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-02-18" href="https://en.wikipedia.org/wiki/?title=Scale_space_implementation&oldid=1276396167">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
</body></html>